#ifndef PATTERN_LOADER_H
#define PATTERN_LOADER_H

#include <SD.h>
#include <vector>
#include <ArduinoJson.h>

// 图案点结构
struct PatternPoint {
  float theta;
  float rho;
};

class PatternLoader {
private:
  bool sdInitialized;
  std::vector<PatternPoint> currentPattern;
  String currentPatternName;
  
  // 流式加载相关
  File currentFile;
  bool isStreamMode;
  size_t filePosition;
  size_t totalFileSize;
  std::vector<PatternPoint> buffer;
  int bufferIndex;
  static const int BUFFER_SIZE = 100;  // 缓冲区大小：100个点
  
  // 🔧 新增：暂停恢复支持
  int globalIndex;                     // 全局读取索引（跨缓冲区）
  int totalPointsProcessed;            // 已处理的总点数
  
public:
  PatternLoader();
  
  // SD卡管理
  bool initializeSD();
  bool isSDReady();
  
  // 文件操作
  bool loadPatternFromFile(const String& filename);
  bool loadLargePatternFromFile(const String& filename);  // 新增：流式加载大文件
  std::vector<String> listPatternFiles();
  bool savePatternToFile(const String& filename, const std::vector<PatternPoint>& pattern);
  
  // 图案切换功能
  String getNextPattern();
  String getPreviousPattern();
  int getPatternCount();
  bool loadPattern(const String& filename);  // 简化的加载方法
  
  // 🔧 新增：扫图数据加载
  bool loadSweepPattern(const void* sweepPoints, int totalPoints);  // 从内存加载扫图数据

  // 图案数据访问
  int getPatternSize();
  PatternPoint getPoint(int index);
  std::vector<PatternPoint> getPattern();
  String getCurrentPatternName();
  
  // 流式访问 - 新增
  bool hasMorePoints();
  PatternPoint getNextPoint();
  void rewindPattern();
  int getTotalEstimatedPoints();
  float getLoadProgress();
  bool isInStreamMode();
  
  // 🔧 新增：暂停恢复支持
  int getCurrentIndex();              // 获取当前读取索引
  bool seekToIndex(int index);        // 跳转到指定索引
  void reset();                       // 重置到开头
  
  // 调试和状态
  void printPatternInfo();
  void printSDStatus();
  
private:
  bool parseThrLine(const String& line, PatternPoint& point);
  String formatPatternLine(const PatternPoint& point);
  bool fillBuffer();  // 新增：填充缓冲区
  void checkAndCreatePatternJson();  // 新增：检查并创建pattern.json文件
  String readTemplatePatternJson();  // 新增：读取项目模板pattern.json文件
  String getDefaultPatternJsonTemplate();  // 新增：获取内置默认模板
  String createDefaultPlaylistJson();  // 🔧 新增：创建默认playlist.json格式
  std::vector<String> listPatternFilesFromDirectory();  // 新增：目录扫描方式（回退方案）
  std::vector<String> scanRootDirectoryForThrFiles();  // 🔧 新增：根目录扫描方法
  std::vector<String> scanForExistingThrFiles();      // 🔧 新增：扫描现有.thr文件方法
  void updatePlaylistWithNewFiles();                  // 🔧 新增：智能更新播放列表（只添加新文件）
  void regeneratePlaylist();                          // 🔧 新增：强制重新生成播放列表（覆盖用户配置）

  // 优化辅助函数
  void printSDInitializationHelp();
  bool validateAndDisplaySDInfo();
  String getCardTypeName(uint8_t cardType);
  String normalizeFilePath(const String& filename);
  bool validateFileAccess(const String& fullPath, size_t& fileSize);
  bool readJsonFromFile(const String& filePath, DynamicJsonDocument& doc);
  bool readJsonFromFileOptimized(const String& filePath, StaticJsonDocument<8192>& doc); // 新增优化版本
  void optimizedProgressReport(int current, int total, const String& operation);
};

#endif
